package ceura.ia.practica.android.brush;

import ceura.ia.practica.android.ui.Celda;
import ceura.ia.practica.android.ui.LaberintoView;

/**
 * Clase/enumeración que representa un pincel para pintar las celdas, hay cuatro
 * tipos definidos por cada background type.
 *
 * @author 66785403 (Jorge Madrid Portillo)
 */
public enum Brush {

    /**
     * Pinta un fondo verde.
     */
    GRASS {
        public boolean paint(Celda celda, LaberintoView laberintoView) {
            Celda endCelda = laberintoView.getEndCelda();
            Celda startCelda = laberintoView.getStartCelda();
            if (celda.compare(endCelda)) {
                laberintoView.setEndCelda(null);
            }
            if (celda.compare(startCelda)) {
                laberintoView.setStartCelda(null);
            }
            celda.setBackGroundType(BackgroundType.GRASS);
            return true;
        }
    },
    /**
     * Pinta un fondo azul.
     */
    WATER {
        public boolean paint(Celda celda, LaberintoView laberintoView) {
            celda.setBackGroundType(BackgroundType.WATER);
            return true;
        }
    },
    /**
     * Pinta el nodo inicial.
     */
    START {
        public boolean paint(Celda celda, LaberintoView laberintoView) {
            laberintoView.setStartCelda(celda);
            celda.setBackGroundType(BackgroundType.START);
            return false;
        }
    },
    /**
     * Pinta el nodo final.
     */
    END {
        public boolean paint(Celda celda, LaberintoView laberintoView) {
            laberintoView.setEndCelda(celda);
            celda.setBackGroundType(BackgroundType.END);
            return false;
        }
    };

    /**
     *
     * @param celda La Celda que se va a pintar.
     * @param laberintoView La referencia del laberintoView, necesaria para
     * realizar comprobaciones a la hora de pintar.
     * @return Si se puede seguir pintando antes de elegir otro pincel.
     */
    public abstract boolean paint(Celda celda, LaberintoView laberintoView);
}
